package com.leetcode.string;

/**
 * 验证回文串
 * 给定一个字符串，验证它是否是回文串，只考虑字母和数字字符，可以忽略字母的大小写。
 * 说明：本题中，我们将空字符串定义为有效的回文串。
 * 示例 1:
 * 输入: "A man, a plan, a canal: Panama"
 * 输出: true
 * 解释："amanaplanacanalpanama" 是回文串
 * 示例 2:
 * 输入: "race a car"
 * 输出: false
 * 解释："raceacar" 不是回文串
 * 提示：
 * 1 <= s.length <= 2 * 105
 * 字符串 s 由 ASCII 字符组成
 * 作者：力扣 (LeetCode)
 * 链接：https://leetcode-cn.com/leetbook/read/top-interview-questions/xah8k6/
 * 来源：力扣（LeetCode）
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 * @author ymy
 * @date 2021年07月23日 16:58
 */
class Code125 {
    public static void main(String[] args) {
        String s = "A man, a plan, a canal: Panama";
        boolean palindrome = isPalindrome2(s);
        System.out.println(palindrome);
    }
    /**
     * 双指针遍历进行判断
     * @author ymy
     * @date 2021/7/23 17:51
     * @param s
     * @return boolean
     */
    public static boolean isPalindrome(String s) {
        int start = 0;
        int end = s.length() -1;
        while (start < end){
            if(!check(s.charAt(start))){
                start++;
                continue;
            }
            if(!check(s.charAt(end))){
                end--;
                continue;
            }
            if(jedge(s.charAt(start),s.charAt(end))){
                start++;
                end--;
                continue;
            }
            return false;
        }
        return true;
    }
    /**
     *  判断字符是否是 大小写字母或数字
     * @author ymy
     * @date 2021/9/2 15:28
     * @param s
     * @return boolean
     */
    public static boolean check(char s) {
        //65-90 是大写英文字母
        //97-122 是小写英文字母
        //48-57 是1-10数字
        return (s >= 65 && s<= 90) || (s >= 97 && s<= 122) || (s >= 48 && s<= 57) ? true : false;
    }

    /**
     * 判断字符是否相等
     * @author ymy
     * @date 2021/9/2 15:24
     * @param s1
     * @param s2
     * @return boolean
     */
    public static boolean jedge(char s1,char s2) {
        //判断字符是否相等
        if(s1 == s2){
            return true;
        }
        //ASCII 码差值超过32则肯定不是一样的字符
        if(Math.abs(s1-s2) != 32){
            return false;
        }
        //如果是大写字母，则都转小写
        s1 = s1 >= 65 && s1<= 90 ? (char)(s1 + 32) : s1;
        s2 = s2 >= 65 && s2<= 90 ? (char)(s2 + 32) : s2;
       return s1 == s2 ? true : false;
    }

    /**
     * 正则表达式
     * ps:效率挺低的
     * @author ymy
     * @date 2021/7/23 18:03
     * @param s
     * @return boolean
     */
    public static boolean isPalindrome2(String s) {
        String actual = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
        String rev = new StringBuffer(actual).reverse().toString();
        return actual.equals(rev);
    }
}
